import axios from 'axios'
import store from '@/store'
import router from '@/router'
import { removeToken } from './auth'
// 创建axios实例
// 基准路径(Node.js中国提供了获取环境变量的API:process.env.环境变量的名称)
const baseURL = process.env.VUE_APP_BASE_API
const service = axios.create({
  baseURL: baseURL
})
// 请求拦截器
service.interceptors.request.use(config => {
  const token = store.getters.token
  // 判断token
  if (token) {
    config.headers = {
      Authorization: `Bearer ${token}`
    }
  }
  return config
}, err => {
  return err
})
// 响应拦截器
service.interceptors.response.use(res => {
  // 返回的是data.以后用数据就不用再.data
  return res.data
}, (err) => {
  // 判断status状态码和code状态码
  if (err.response.status === 401 && err.response.data.code === 10002) {
    // 删除vuex中的token
    store.commit('user/SET_TOKEN', '')
    // 删除本地对的token
    removeToken()
    // 删除用户信息
    store.commit('clearInfo')
    // 跳转到登录页
    router.push('/login')
  }
  return Promise.reject(err)
})
// 自定义函数封装通过调用接口的方法:支持固定的data传参
export default (options) => {
  // 支持默认请求方式为GET,(调用接口的时候不传method属性)
  let key = ''
  if (options.method) {
    // 如果传递method,那么GET请求使用params;其他请求是data
    key = options.method.toUpperCase() === 'GET' ? 'params' : 'data'
  } else {
    // 如果没有传递method属性,那么默认GET请求,此时使用params传参
    key = 'params'
  }
  return service({
    url: options.url,
    // 如果接口中没有请求方式,则默认是get请求方式
    method: options.method || 'GET',
    // 如果请求方式是GET,就是params属性传递参数,
    // 如果请求方式是post , 就是data属性传参
    // ES6的规则:对象的键key可以是动态的,必须加上[]
    [key]: options.data
  })
}
